﻿
/**
 * ...
 * @author wangjun
 */
//------------------- beautiful line -----------------------
// [use] 数据分页【数组型】
// [style] 数据层->显示层
// [usage]
/*
 * import blog.DataSet;
 * var pageData:DataSet = new DataSet(data, {perPn:5, Cn:4});	//对象参数含义见【外部变量部分】
 * 
 * pageData.bEndLoop = 1;	//是否尾循环
 * pageData.bSttLoop = 1;	//是否始循环
 * 
 * pageData.step2_countPageNum();
*/
 class blog.DataSet {
	 
	// 外部变量部分
	var Data:Array;			//原始数据【数组型】
	var perPn:Number;		//每页条数
	var Cn:Number;			//显示容器的个数
	
	// 内部变量部分 
	var ttPn:Number;		//总页数
	var box:Array = [];		//类似洋葱皮的虚拟容器，是数据中的一段, 是内置的黑匣子
	var bSttLoop:Boolean;
	var bEndLoop:Boolean; 
	var Dfull:Boolean;
	//------------------- beautiful line -----------------------
	// [use] 构造器
	public function DataSet(data:Array, vars:Object) {
		this.Data 	= data; 
		this.perPn 	= vars.perPn;
		this.Cn 	= vars.Cn;
	}
	//------------------- beautiful line -----------------------
	// [use] 计算分页数
	// [usage] _________
	public function step2_countPageNum() {
		//trace(Data.length);
		this.ttPn = Math.ceil(Data.length / perPn);
		//trace('ttPn : '+ttPn);
		this.Dfull = (Data.length > perPn) ?true : false;		
		//trace('Dfull : '+Dfull); 
	}
	//------------------- beautiful line -----------------------
	// [use] 取数据
	public function getNow() {
		this.updateBox(0);
		return getDatg(Data, 0, perPn);
	}
	public function getNext() { 
		var n:Number = this.updateBox(1); 
		if (!bEndLoop) {
			if (n>=ttPn) {
				return false;
			} else {
				return getDatg(Data, n, perPn);
			}
		} else {
			return getDatg(Data, getNC(n), perPn);
		}
	}
	public function getPre() { 
		var n:Number = this.updateBox(-1);
		if (!bSttLoop) {
			if (n<=0) {
				return false;
			} else {
				return getDatg(Data, n, perPn);
			}
		} else {
			return getDatg(Data, getNC(n), perPn);
		}
	}
	//------------------- beautiful line -----------------------
	// [use] 函数工具
	private function getDatg(a:Array, n, m) {
		return a.slice(n*m, (n+1)*m);
	}
	private function updateBox(id):Number {
		if (box.length<Cn) {
			if (id==0) {
				box.push(0);
			} else if (id>0) {
				box.push(box['end']+1);
			} else {
				box.unshift(box['stt']-1);
			}
		} else {
			if (id>=0) {
				box.shift();
				box.push(box['end']+1);
			} else {
				box.pop();
				box.unshift(box['stt']-1);
			}
		} 
		box['end'] = box[box.length-1];
		box['stt'] = box[0]; 
		if (id>0) {
			return box['end'];
		} else {
			return box['stt'];
		}
	}
	private function getNC(n) {
		var nc;
		var vv = ttPn;
		if (n>=ttPn) {
			nc = n%(vv);
			//trace('1 : '+n+'|ct = '+ct+'|nc = '+nc); 
		} else if (n<0) {
			if (n>=-vv) {
				nc = vv+n;
				//trace('-1 : '+n+'|ct = '+ct+'|nc = '+nc);
			} else {
				nc = vv+n%vv;
				if (nc == vv) {
					nc = 0;
				}
				//trace('-1 : '+n+'|ct = '+ct+'|nc = '+nc);                       
			}
		} else {
			nc = n;
			//trace('0 : '+nc); 
		}
		return nc;
	}
}
